package 集合;
import java.util.*;
/*
 Map接口:
 1,通过键值对存储的一组数据
 2,键不可以重复，值可以重复
 3,具体的实现类: HashMap  TreeNap Hashtable LinkedHashMap(hashmap的子类，内部是一个双重链表,确保了元素添加顺序)
    TreeMap用法同TreeSet，键对象需要实现comparable或有comparator比较器.
*/
public class X06Map和HashMap
{
	public static void main(String[]args){
		hashmap();
	}
	/*
	  HashMap
	  1，实现原理:基于哈希表:数组+链表(+二叉树(红黑树)1.8以后);
	  2，默认加载因子为0.75(即数组75%长度时是即为满)，默认长度16
	  3，存储到哈希表过程：首先通过hash()计算key对象的hash值，然后用hash取余长度(默认16)，确定元素
	       在数组中的位置，当这个位置有对象时，以链表形式存储，jdk1.8后，链表长度大于8时替换为以红黑树形式存储
	  4，特点：取值更快，数据越多，性能的表现越明显
	  5，扩充算法:当达到75%长度是，新容量=旧容量<<1(相当于乘2)，这样子哈希表需要重新计算(散列)，元素和链表位置也需重新计算排列
	     所以尽量避免多次扩充，因为影响性能
	  6，线程不安全适合单线程
	*/
	private static void hashmap(){
		Map<Integer,String> map=new HashMap<>();
		map.put(1,"jack");
		map.put(2,"tom");
		map.put(3,"lucy");
		map.put(4,"lily");
		map.put(5,"kece");
		map.put(6,"vicy");
		System.out.println(map.get(1));//根据键取值
		//map遍历 方法1
		System.out.println("============");
		Set<Map.Entry<Integer,String>> entrys= map.entrySet();
		for(Map.Entry e:entrys){
			System.out.println(e.getKey()+"->"+e.getValue());
		}
		//方法2 便利Key 根据key获取value
		System.out.println("============");
		Set<Integer> keys=map.keySet();
		for(Integer i:keys){
			String value=map.get(i);
			System.out.println(i+"->"+value);
		}
		//方法3 遍历value 根据value获取不了key，只能便利value
		System.out.println("============");
		Collection<String> values=map.values();
		for(String value:values){
			System.out.println(value);
		}
		//方法4 forEach()方法
		//map.forEach((key,value)->System.out.println(key+"->"+value));//lambda表达式方法
	}
	/*
	  Hashtable 自jdk1.0就有
	  1，实现原理：基于哈希表(数组+链表)
	  2，默认大小11,默认加载因子0.75
	  3，扩充方式原容量*2+1
	  4，线程安全的，适合多线程
	
	*/
	private static void hashtable(){
		Hashtable<String,String> table=new Hashtable<>();
		table.put("one","lily");
		//...方法同hashmap
		
	}
}
/*
void	clear()
从该地图中删除所有的映射（可选操作）。
<1.8新方法> default V	compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
尝试计算指定键的映射及其当前映射的值（如果没有当前映射， null ）。
<1.8新方法> default V	computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
如果指定的键尚未与值相关联（或映射到 null ），则尝试使用给定的映射函数计算其值，并将其输入到此映射中，除非 null 。
<1.8新方法> default V	computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
如果指定的密钥的值存在且非空，则尝试计算给定密钥及其当前映射值的新映射。
boolean	containsKey(Object key)
如果此映射包含指定键的映射，则返回 true 。
boolean	containsValue(Object value)
如果此地图将一个或多个键映射到指定的值，则返回 true 。
Set<Map.Entry<K,V>>	entrySet()
返回此地图中包含的映射的Set视图。
boolean	equals(Object o)
将指定的对象与此映射进行比较以获得相等性。
default void	forEach(BiConsumer<? super K,? super V> action)
对此映射中的每个条目执行给定的操作，直到所有条目都被处理或操作引发异常。
V	get(Object key)
返回到指定键所映射的值，或 null如果此映射包含该键的映射。
<1.8新方法> default V	getOrDefault(Object key, V defaultValue)
返回到指定键所映射的值，如果不存在key ，返回defaultValue。
int	hashCode()
返回此地图的哈希码值。
boolean	isEmpty()
如果此地图不包含键值映射，则返回 true 。
Set<K>	keySet()
返回此地图中包含的键的Set视图。
default V	merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
如果指定的键尚未与值相关联或与null相关联，则将其与给定的非空值相关联。
V	put(K key, V value)
将指定的值与该映射中的指定键相关联（可选操作）。
void	putAll(Map<? extends K,? extends V> m)
将指定地图的所有映射复制到此映射（可选操作）。
<1.8新方法> default V	putIfAbsent(K key, V value)
如果指定的键尚未与某个值相关联（或映射到 null ）将其与给定值相关联并返回 null ，否则返回当前值。
V	remove(Object key)
如果存在（从可选的操作），从该地图中删除一个键的映射。
<1.8新方法> default boolean	remove(Object key, Object value)
仅当指定的key当前映射值都相同时删除该条目。
<1.8新方法> default V	replace(K key, V value)
只有当目标映射到某个值时，才能替换指定键的条目。
<1.8新方法> default boolean	replace(K key, V oldValue, V newValue)
仅当当前映射到指定的值时，才能替换指定键的条目。
default void	replaceAll(BiFunction<? super K,? super V,? extends V> function)
将每个条目的值替换为对该条目调用给定函数的结果，直到所有条目都被处理或该函数抛出异常。
int	size()
返回此地图中键值映射的数量。
Collection<V>	values()
返回此地图中包含的值的Collection视图。
*/
